import java.applet.Applet; import java.awt.*; import java.util.NoSuchElementException; import java.util.StringTokenizer; //助教,你要測試的話,可以將視窗放到最大, //然後把你的文章剪貼到程式的輸入區,就可以執行了。 //本程式,建議使用 jdk 1.02 編譯執行 //將文章分成句子。 final class StringAnalyst extends StringTokenizer{ StringAnalyst(String str){ super(str,".?");//用句點、問號做分隔字元 } } //將句子分成單字。 final class SentenceAnalyst extends StringTokenizer{ SentenceAnalyst(String str){ super(str,"\n\r\t ,:");//用這些字元分隔字元 } } //框架視窗類別,就是有最大化、最小化…的框框 final class MyFrame extends Frame{ static int frameNumber=0;//計錄總數 static int frameIndex=0;//框架索引 public MyFrame(String str){ super(str+" - "+ ++frameIndex);//標題是第 frameIndex 個框架視窗 frameNumber++; } public boolean handleEvent(Event evt){ if(evt.id==Event.WINDOW_DESTROY){//如果按下了『視窗關閉』 if(--frameNumber==0){//如果全部都結束了 dispose(); System.exit(0);//離開 java 虛擬機器 } else dispose();//關閉框架視窗 } return super.handleEvent(evt);//丟給父類別處理 } }//end of class MyFrame //放 awt 元件的容器 final class MyPanel extends Panel{ final int textAreaNumber=4; Panel[] panelSmall; Panel[] panelBig; Label[] label; TextArea[] text; Button execBtn,clearBtn,newWindowBtn; //初使化,按鍵、文字區、標題……等 public MyPanel(){ int i; //設定三個按鍵內容 execBtn=new Button("Execute"); clearBtn=new Button("Clear"); newWindowBtn=new Button("New window"); //設定標題 label=new Label[4]; label[0]=new Label("Input area",Label.CENTER); label[1]=new Label("Words",Label.CENTER); label[2]=new Label("Sentences",Label.CENTER); label[3]=new Label("Result",Label.CENTER); text=new TextArea[textAreaNumber]; panelSmall=new Panel[textAreaNumber]; panelBig=new Panel[2]; for(i=0;i<textAreaNumber;i++){ //小容器[i] 內裝一個標題和一個文字區塊 panelSmall[i]=new Panel(); text[i]=new TextArea(10,30); panelSmall[i].setLayout(new BorderLayout(0,0)); panelSmall[i].add("North",label[i]); panelSmall[i].add("Center",text[i]); }//end of for for(i=1;i<textAreaNumber;i++) text[i].setEditable(false);//三個文字區塊設成不可以修改 panelBig[0]=new Panel(); panelBig[1]=new Panel(); panelBig[0].setLayout(new GridLayout(2,2));//放4個小容器用 panelBig[1].setLayout(new GridLayout(1,3));//放3個按鍵用 for(i=0;i<textAreaNumber;i++) panelBig[0].add(panelSmall[i]); panelBig[1].add(execBtn); panelBig[1].add(clearBtn); panelBig[1].add(newWindowBtn); setLayout(new BorderLayout(0,0)); add("Center",panelBig[0]);//放到主容器 add("South",panelBig[1]); show();//顯示出來 }//end of MyPanel() //控制按鍵 public boolean action(Event evt,Object obj){ if(evt.target==execBtn){//按了『執行鍵』 go(); return true; } else if(evt.target==clearBtn){//按了『清除鍵』 for(int i=0;i<textAreaNumber;i++) clearTextArea(i); return true; }else if(evt.target==newWindowBtn){//按了『新視窗鍵』 MyFrame frame=new MyFrame("[ Home Work 1 ]"); frame.setLayout(new BorderLayout(10,10)); frame.add("Center",new MyPanel());//加到中間 frame.pack();//自動排列大小 frame.show();//顯示 return true; } return false;//沒有做事,則傳回 false }//end of action() public void clearTextArea(int i){//清除第 i 個文字區塊 text[i].setText(""); } //真正的主程式 public void go(){ String strTemp=text[0].getText(); strTemp=strTemp.substring(0,strTemp.lastIndexOf('.')); StringAnalyst sentences=new StringAnalyst(strTemp); SentenceAnalyst words; int si=0,wi=0; //計算字和句子個數用? String maxWordNumberSentence="";//最多字數的句子 String maxLetterNumberWord=""; //最長的字 int maxWordNumber=0; //最多字數的句子之字數 int maxLetterNumber=0; //最長的字之字母數 int totalSentences; //句子的個數 int totalWords=0; //字的總數 int totalLetters=0; //字母的總數 for(int i=1;i<textAreaNumber;i++) //清除三個輸出視窗 clearTextArea(i); totalSentences=sentences.countTokens();//句子總數。 while(sentences.hasMoreTokens()){ String tempString=""; try{ int b; //每次得到一個句子。 tempString=sentences.nextToken(); }catch(NoSuchElementException e){ System.out.println(e);//其實不可能發生。 }//end try words=new SentenceAnalyst(tempString); StringBuffer sentence=new StringBuffer(""); int wordNumber=words.countTokens();//句子中的字數。 for(int i=0;i<wordNumber;i++){ totalWords++;//計算總字數 String word=""; try{ int j; word=words.nextToken();//取下個字 /*不要判斷是否為英文了。 多寫多錯! for(j=0;j<word.length();j++) if(!Character.isLetterOrDigit(word.charAt(j)))//是不是全部是英文字母或數字? break; if(j!=word.length()){//不是的話 text[3].appendText(word+" is not a legal English word.\n" +"Program abort.\n"); return; }//end for */ }catch(NoSuchElementException e){ System.out.println(e); } totalLetters+=word.length();//計算總字母數 text[1].appendText("["+ ++wi+"]"+word+"\n");//輸出字 sentence.append(word+" "); if(word.length()>maxLetterNumber){ maxLetterNumber=word.length(); maxLetterNumberWord=word;//換上字母最多的字 }//end of if }//end of for if(wordNumber>maxWordNumber){ maxWordNumber=wordNumber; maxWordNumberSentence=sentence.toString();//換上字數最多的句子 }//end of if text[2].appendText("["+ ++si+"]"+ sentence.toString()+'\n');//輸出句子 }//end of while //顯示結果。 text[3].appendText("(1) Total sentences : "+ totalSentences+'\n'); text[3].appendText("(2) Total words : "+ totalWords+'\n'); text[3].appendText("(3) Total letters : "+ totalLetters+'\n'); text[3].appendText("(4) Average words of a sentence : "+ (double)totalWords/totalSentences+'\n'); text[3].appendText("(5) Average letters of a word : "+ (double)totalLetters/totalWords+'\n'); text[3].appendText("(6) {"+maxLetterNumberWord+"} has "+ maxLetterNumber+" letters.\n"); text[3].appendText("(7) {"+maxWordNumberSentence+"} has "+ maxWordNumber+" words.\n"); }//end of go() }//end of class MyPanel public class WinHw1 extends Applet{ //如果是執行 Applet 的話,由此開始執行 public void init(){ setLayout(new BorderLayout(0,0)); add("Center",new MyPanel());//把『我的容器』加到中間 } //如果是執行 Application 的話,由此開始執行 public static void main(String[] args) { MyFrame frame=new MyFrame("[ Home Work 1 ]"); frame.setLayout(new BorderLayout(0,0)); frame.add("Center",new MyPanel());//把『我的容器』加到中間 frame.pack(); frame.show(); } }//end of class WinHw1